package com.season.seasonStudy.javase.j_008_database;
/**
 * 2016年4月25日 09:13:41
 * 刚才老师说的好逗啊
 * 自己懒不想装系统,如果出问题了怎么办呢? 那就去求别人
 * 如果自己会怎么办?那就是别人求自己了
 * 至少可以混顿饭,啊哈哈.
 * 
 * 手机太发达了,跟他娘还亲
 * 
 * 数据库概念:
 * 		数据库:
 * 			容量大,长久保存
 * 			查询效率高
 * 			安全,共享
 * 
 * 		原因:
 * 			存放数据方式:
 * 				硬盘:量大,可长期存储
 * 					电  查找不方便
 * 				光盘:
 * 				纸上:
 * 				脑子:瞬间遗忘
 * 	数据库  dbs 
 * 			数据文件	DBF
 * 			日志文件	ldf
 * 	dbms(开发的管理软件)
 * 		1.远程调用	客户端----数据库	需要一个请求,响应	求婚,不去求,谁去嫁给自己呢?	
 * 		2.数据控制:
 * 				存:	处理冗余	重复做,会产生职业病:伙夫范伟
 * 					完整性约束	数据的验证(填10000岁,平均低不了)	消费的理念,你需要一套东西,就需要其他东西(前提是信息可靠)
 * 														买了手机要买耳机吧,因为你不能公开放
 * 														去健身,不想听公开放的,那就去买蓝牙运动耳机吧
 * 				取:	SQL == DDL DCL DQL MQL 
 * 
 * 	数据存储方式:
 * 		表:
 * 			横向
 * 			纵向		古人,写的东西是从上到下,他们是想让你点头的,觉得有道理,不然就会总是摇头的哦
 * 		
 * 		表格设计:
 * 			1.重复问题	重复列不能再分
 * 			2.主键列(保证每行数据唯一)
 * 			3.必须与其直接相关.其他列与主键,直接相关	一个人除了成绩,其他相同,这么着数据库大小成倍增长.
 * 	1.搞清楚谁是一谁是多		一本图书类型可以对应多本书
 * 						一本书只对应一个图书类型
 * 						多的一方拥有  一的一方的外键(有关系)
 * 
 * 	2.一个学生多门课,一门课多个学生	多对多	不能在学生里放课程,课程里不能放学生
 * 		由第三张表2个 一对多完成  拥有2外键	
 * 
 * 外键引用主键表中的主键
 * 数据完整性约束:
 * 	1.域完整性:
 * 		类型问题,非空控制,检查约束
 * 	2.实体完整性:
 * 		标识	表内一行数据与另一行的区别 	两行不能重复(主键)
 * 		主键,唯一约束	
 * 	3.引用完整性:
 * 		两表之间的关系	严格错误	你可以不参加考试,但是不能一个不存在的人来考试
 * 		外键表的外键,必须在主键表的主键中存在.
 * 
 * 安全,共享设置:
 * 		安全:				只要不跟别人交流,这是最安全的
 * 			数据库服务(用户登录,小区大家都能登录)
 * 
 * 			数据对象(用户创建)的权限分配(用户自己的门)才能共享
 * 
 * 			内部数据处理  需要分配权限
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 如果一个人从小开始记日记,就能在现在知道自己发生了什么,
 * 人人生了都一样,人人没有可比性
 * 比什么比,把自己弄好就行了
 * 嗯,写个日记看看,至少对以后有帮助
 * 如果有日志,人不该犯第二次相同错误
 * 
 * 
	 * oracle 半关系型半对象型数据库
	 * SQL
	 * 		DDL	数据定义语言
	 * 			create alter drop
	 * 				create 类型
	 * 				1
	 * 			user		用户
	 * 			table		表
	 * 
	 * 			sequence	序列
	 * 			
	 * 			index		索引
	 * 			view		视图
	 * 			constraint	约束
	 * 
	 * 			procedure	存储过程
	 * 			function	函数
	 * 			trigger		触发器
	 * 			tablespace	表空间	不建议新建,建了有对应数据文件.
 * 					
 * 			
 * 			
 * 		DCL	数据控制语言
 * 			grant	grant 	角色||权限 	to user
 * 			revoke	revoke x 	from user
 * 			1
 * 		DML	数据处理语言
 * 			select update delete
 * 		DQL	数据查询语言
 * 
 * 
 */

/**
 * tablespace创建	创建的时候最好是系统用户
 * 		create tablespace mytablespace
 * 		datafile 'c:\database\aha.dbf'	(得是存在的目录)
 * 		size 3M;
 * 		
 * 		drop tablespace mytablespace;	
 *
 * user创建
 * 		create user books
 * 		identified	by 123
 * 		default tablespace users;(已经存在的,不要与这些名字重了.其实也可以自己写表空间)
 * 		
 * 前2步是在system管理员下创建	conn books/123;
 * 等等......还没创建权限
 * 
 * 分配权限(只有,有权限的人才能给人家)
 * 		权限:	角色	具体权限	(角色拥有一堆具体权限,一般用角色处理,方便)
 * 			角色 roles	connect访问	resource创建	dba
 * 		system下
 * 			授予:
 * 			grant coonect,resource to books;
 * 			grant select on scott.dept to books;(scott授予不用加scott   system需要加的)
 * 			回收:			
 * 			revoke connect,resource from books
 * 		
 * 当我进入books用户,不能看scott的
 * select * from scott.dept;
 * 			grant select on scott.dept to books;(scott授予不用加scott   system需要加的)
 * 		1
 *-----------------------------------------------------------------------------------------
 * 表的创建
 * 		create table book(
 * 			id number(8) not null,
 * 			name char(8)固定长度,不够就空格补 电话号码,邮编
 * 				 varchar(8)	别的数据库		varchar可变长度
 * 				 varchar2(8)oracle特有的
 * 				 nvarchar	国际资源码	一个汉字一个坑,企业一般要求用nvarchar
 * 				 nvarchar2
 * 			price number(10,2),
 * 			publishdate date,(或者时间戳,一般不用,精确点timestamp)
 * 			auther nvachar2(8),
 * 			info varchar(1000)
 * 		)
 * 		默认	允许为空
 * 添加列
 * 		alter table book
 * 		add (column并没有加,不知道为什么,不规范) booktype number(主外键类型一致); 
 * 		在删除的时候 alter table books		 drop column(此时需要写) info;
 * 		1
 * 添加主键
 * 		alter table book
 * 		add constraints pk_book_id primary key (id);
 * alter table book drop constraints pk_book_id;		
 * 
 * 添加check约束
 * 		alter table book
 * 		add constraints ck_book_price check(price>0);
 *
 * 引用完整性
 * 
 * 添加外键
 * 		alter table book
 * 		add constraints fk_book_booktype(他俩的关系) 
 * 			foreign key(booktypeid)	
 * 			references(引用) booktype(id);	
 * 
 * 规范数据库所有都给大写,看着难受,还是小写吧,所以不区分大小写
 * 		
 * 序列:
 * 		create sequence seq_booktype(表名)
 * 		start with 1
 * 		increment by 1
 * 		cache 10(一次性生成10个,用完了再生成);
 * 
 * -------------------------------------------------------------		
 * 添加	
 * 		insert into booktype(id,name)(可以直接拖过来)
 * 					values(seq_booktype.nextval,'xixi.');
 * 		当添加失败,还是会取值的,下一个接着下去
 * 		所以主键只要保证唯一就好,不连续也一样,不要强迫症哦
 * 		
 * 只有提交事物之后才能继续下去		
 * 		
 * 		可以好几个表用统一序列,不建议用
 * 		1.序列有长度限制
 * 		2.强迫症哦
 * 		
 * 		1
 * 时间的添加,oracle中会出错的因为 你用的是字符串
 * 使用数据库函数
 * to_date()
 * 		to_date('2012-11-2','yyyy-mm-dd')(mm小写是月份,分钟mi)(这里不区分大写小写)(相等直接=不是==)
 * 	selct to_date('2012-11-2','yyyy-mm-dd') from dual;做测试用的dual假表
 * 
 * 
 * 
 * 修改
 * 		update booktype set name='ceshi';	统一设定密码啥的,不然很危险
 * 		where id= 8;	限定下
 * 
 * 		commit;
 * 
 * 	主键一般是不会改的	1.有外键数据	2.其他
 * 		1
 * 删除	涉及到外键约束问题
 * 		delete from booktype where ?;
 * 
 * 只有一个地方区分大小写: 	引号里面
 * 
 * 
 * 导数据:(对了自己的)
 * 可以导出哦	export userObjects	表结构序列,对象
 * 
 * 			导出表,选择中间的
 * 
 * dos下	exp(不是sql里)
 * 		imp
 * 
 * 查询:
 * 	select deptno 编 号  from dept;	//会出事的
 * 	select deptno "编 号"  from dept;	//这个还好
 * 	select deptno '编 号'  from dept;	//这是不行的
 * 	select deptno,'编 号'  from dept;	//逗号是用来分开的	单引号,是常量值
 * 
 * 	select * from dept where 列=值	<>不等于	deptno+29>10 这是可以的		字符串拼接	dname||'ss'
 * 									deptno/9
 * 						非  not写在前面
 * 	+-* /,||,and or not <> =
 * 
 * 模糊查询
 * between	and,	in,   like
 * select * from dept where deptno	between 10 and 20
 * select * from emp  where hiredate	between to_date('1922-11-1','yyyy-mm-dd') 
 * 											and to_date('1997-11-1','yyyy-mm-dd');
 *			//包含边界
 * 		in等值匹配
 * select * from dept where deptno in(10,20,30);	建议用这个代替or	日期,文字都可以用
 * 
 * select * from dept where dname like'A%';		模糊查询
 * 		% 0~N任意字符		
 * 		_ 一个任意字符
 * 		is null	跟空字符串不一样	where dname='';(空字符串写了但是没显示)	is not null
 * 		
 * 		select ename,sal,sal+comm from emp		原始数据没变,这只是虚拟的结果	列+空结果是空
 * 		where comm is not null and hiredate=to_date('1997-11-1','yyyy-mm-dd')
 * 			order by sal desc(降序	asc升序,默认)	升序0~N
 * 			order by sal,hiredate desc(先排主的,再排次的)
 * 			desc是个人顾个人,所以sal没理他,是默认
 * 	先 过滤,再排序
 * 
 * -------------------------------------------------------------------------------------------
 * 函数:		聚合函数(数据统计)	其他函数
 * select to_char(hiredae,'yyyy'),nvl(comm,0) from emp;	对每一个单元格数据都进行处理
 * 	
 * 		聚合函数,不是针对某一行的,是一个汇总
 * select count(*),sum(sal),avg(sal),min(sal),max(sal) from dept;
 * 		最大最小值,数字,时间(可以的)
 * 	count可以过滤空值,	*所有类都看看,如果放有空的列,那就去除空的
 * 	avg(sal+comm)	若comm为空,那就会让数据不准确,然后呢就会让某些和是null,所以呢该nvl(comm,0)
 * 
 * 	聚合函数,需考虑空值问题
 * 
 * 	任何聚合函数旁边出现非聚合函数列 , 所以非聚合函数 , 都得放在  group by
 * 
 * 	分组没显示出来分组原因 , 没意义
 * 		select job,avg(sal),min(sal),max(sal) from emp group by job;
 * 
 * 多条件呢?
 * 
 * 		干34年,技术就别走了,争取进管理岗,	技术肯定钱少, 除非接私活.  也就那样吧
 * 你不能聚合时间啊,时间很难一样,那就to_char(年份)
 * 
 * 如果想把81年的去掉		那就去掉,再聚合,(逻辑上最好是先去掉,再聚合)	先聚合在去掉
 * having to_char()<>'1981'	(过滤下)	聚合之后过滤
 * where							聚合之前过滤(除了聚合后的都最好写在这里)
 * 	所以 , 聚合函数作为条件,放在having里面
 * 		1.显示的表里,having where都行	where效率高点,能过滤掉就过滤
 * 		2.不显示	那就只能where 不然having里怎么显示,没有怎么操作
 * 		3.聚合后的写在having里面
 * 		4.聚合完 才排序,不然没意义
 * 
 * --------------------------------------------------------------------------------------------
 * 多表的:
 * 1.查询 名字中包含A的员工的平均收入
 * 2.查询 部门号为10,20,30中的平局收入高于2000的
 * 3.查询 1981年员工个人的总收入(收入+提成)
 * 4.查询 1981-1-1 到 1982-3-1之间的各岗位的员工人数
 * 									最低工资和最高工资的差
 * 5.查询 没有佣金的 各部门的员工的平均收入 和 人数
 * 6.查询 岗位人数大于3的岗位和人数(从高到低 排序)
 * 
 * 没聚合函数,分组就是浪费
 * 
 * 
 * select 
 * 
 * 
 * having 聚合函数作为条件
 * order by 排序列
 * -----------------------------------------------------------------
 * union 并集, intersect 交集 , minus 减
 * 	列数变了			行数变了
 * 	select empno,ename,sal from deptt where empno in(7499,7566)
 * 	union(union all不会减去重复的)
 * 	select empno,ename,sal from deptt where empno in(7499,7566)
 * 
 * ----------------------------------------------------------------------------
 * 数据的添加
 * 	select * into test from emp; 不行,用下面的
 * 
 * 	create table abc as 
 * 	select *(或者具体的) from emp;	缺点,只能用一次(创建并插入数据,也可以union自己造表)
 * 
 * 	insert into abc(empno,ename,sal)	必须存在表结构
 * 	select empno||'hi',ename,sal from deptt where empno in(7499,7566)
 * 	union
 * 	select empno||'hi',ename,sal from deptt where empno in(7499,7566)
 * 
 * 	
 *   
 * case when 	结果当...then...
 * 	select ename,(	case when sal>=5000 then 'A'
 * 						 when sal>=3000 then 'B'	跟else if 一样,只走一半		性能上不好,还不如java里面写呢
 * 						 when sal>=1500 then 'C'
 * 						 else 'D'
 * 					end)'等级'(直接写汉字呢?写字符串又会发生什么呢?)
 * 		from dept;
 * 
 * 
 * ---------------------------------------------------------------------------------
 * 2016年4月29日 08:57:53
 * 表关联
 * 		select 列 from 表1,表2 where 表1.列=表2.列
 * 		关联后,以多的一方为准, 肯定会重复, 最好还是聚合下吧
 * 		用一个表的主键 跟 另一个表的外键关联
 * 
 * 表链接	inner join,left outer join, right outer join
 * 
 * 	select 列 from 表1 inner join 表2
 * 	select * from dept inner join emp on dept.deptno=emp.deptno
 * 			跟上面表关联 结果一样
 * 	select * from dept cross join emp
 * 
 * 		经过inner join之后少了一个部门, 这时需要左右链接
 * left outer join
 * 
 * 	一个入门级的查询:
 * 	select dname,count(*) from dept lef join emp on dept.deptno=emp.deptno
 * 	select dname,count(emp.*) from dept lef join emp on dept.deptno=emp.deptno
 * 		删除不要乱删,删除错了,主外键啥的
 * 		一定要备份, 如果出错了 ,会死的很惨 ,等死吧
 * 
 * 右外连接, 无外乎位置
 * 
 * full outer join		在innerjoin基础上, 加上左右连接 关联不上的  处理垃圾数据很好用
 * 左 和 全 都比较用的多些
 * 
 * 
 * 
 * 
 * 
 * -------------------------------------------------------------------------------
 * 子查询exixt,any,all
 * 	--条件子查询
 * 		select * from dept where deptno in (select deptno from emp)
 * 
 * 	--列子查询(单个值)
 * 		selectt ename,sal-(select avg(sal) from emp) from emp
 * 			where sal > (select avg(sal) from emp)
 * 
 * 	--表子查询(多行多列)
 * 		select * from emp inner join 
 * 			(select deptno,avg(sal) avgsal from emp group by deptno) t
 * 			on t.depno=emp.deptno
 * 		能过滤的,先过滤掉, 这是一种很好的处理方案  , 提高了效率
 * 
 * 	--条件子查询
 * 
 * 
 * -----------------------------------------------------------------
 * 伪列, 假列
 * rowid rownum
 * 
 * rownum排序之后就不好使了
 * 排完序之后的rownum就好使了
 * 
 * 50个sql语句,能写多少是多少
 * 
 * 
 * 
 */
public class Database {

}
